/*******************************************************************************
 * Copyright (C), 2014, BeeIoT Tech. Co., Ltd. 
 * FileName:        object.c
 * Author:          lvxin 
 * Version :        1.0
 * Date:            2014-09-13 09:40:12
 * Description:     
 *                  使用fifo机制处理命令
 * Function List:   // 主要函数及其功能
 * 1. ------- 
 * History:
 * <author>   <time>                <version >  <desc> 
 * lvxin      2014-09-13 09:40:12   1.0         build this moudle 
 ******************************************************************************/

/*******************************************************************************
 *  *INCLUDES
 *  */
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include "cmdfifo.h"

/*******************************************************************************
 *  *MICROS
 *  */
#define     MAX_FIFO_LEN     20   //fifo最大数量

/*******************************************************************************
 *  *CONSTANTS
 *  */

/*******************************************************************************
 *  *TYPEDEFS
 *  */
typedef struct sm_inner_cmd
{
    uint8_t cmd;
    uint8_t param;
}sm_inner_cmd_t; //命令


static cmd_fifo_cmd_handle_t *l_handle_list;//命令句柄列表
static int l_handle_list_total;


/*******************************************************************************
 *  *GLOBAL VARIABLES
 *  */

/*******************************************************************************
 *  *EXTERNAL VARIABLES
 *  */

/*******************************************************************************
 *  *EXTERNAL FUNCTIONS
 *  */

/*******************************************************************************
 *  *LOCAL VARIABLES
 *  */

static sm_inner_cmd_t l_fifo_list[MAX_FIFO_LEN]; //fifo列表

static volatile int head = 0;
static volatile int last = 0;


/*******************************************************************************
 *  *PROFILE CALLBACKS
 *  */

/*******************************************************************************
 *  *LOCAL FUNCTIONS
 *  */
//命令出fifo
static int cmd_fifo_pop(sm_inner_cmd_t *cmd)
{
    if (head == last)//队列已空
    {
        return -1;
    }
    *cmd = l_fifo_list[head];
    head = (head+1) % MAX_FIFO_LEN;
    return 0;
}


/*******************************************************************************
 *  *PUBLIC FUNCTIONS
 *  */

//初始化命令句柄
int cmd_fifo_init(const cmd_fifo_cmd_handle_t *handle_list,int number)
{
    if (handle_list == NULL)
    {
        return -1;
    }
    l_handle_list =(cmd_fifo_cmd_handle_t *) handle_list;
    l_handle_list_total = number;
    return 0;
}

//命令推入fifo
int cmd_fifo_add (char cmd, char param)
{
    if ((last+1)%MAX_FIFO_LEN == head) //队列已满
    {
        return -1;
    }
    l_fifo_list[last].cmd = cmd;
    l_fifo_list[last].param = param;
    last = (last+1)%MAX_FIFO_LEN;
    return 0;
}

//处理执行内部命令
int cmd_fifo_main_loop()
{
    sm_inner_cmd_t tmp;
    while (cmd_fifo_pop (&tmp) != -1)
    {
        if (tmp.cmd < l_handle_list_total)
            l_handle_list[tmp.cmd].proc (tmp.cmd, tmp.param);
    }
    return 0;
}
